iT邦幫忙

2026 iThome 鐵人賽

0
JavaScript

30天從零打造醫療資訊小系統系列 第 23 篇

Day 26|加入登入功能:使用 Session 記錄登入狀態

  • 分享至 

  • xImage
  •  

一、為什麼醫療資訊系統需要登入?

前面完成的病患清單、詳細資料與修改功能,如果沒有任何登入機制,只要知道網址,就可能有人直接開啟頁面。

因此,今天要加入一個基本的登入流程,並透過 Session 記錄使用者是否已登入。

在 Servlet 中,可以使用 HttpSession 保存跨請求的登入狀態。這也是許多 Java Web 應用程式管理使用者狀態的基本方式。

二、建立登入表單

新增 login.jsp:

這裡使用 POST 傳送登入表單,避免帳號與密碼直接出現在網址中。不過,POST 本身並不等於加密,正式系統仍須使用 HTTPS。

三、建立 LoginServlet

為了先理解登入流程,以下使用教學用的固定測試帳號。這只是展示 Session 的方式,不代表正式系統應將帳號密碼寫死在程式碼中。

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
// 僅供本機練習的測試帳號
boolean valid =
"demo".equals(username)
&& "demo123".equals(password);
if (valid) {
HttpSession oldSession = request.getSession(false);
if (oldSession != null) {
oldSession.invalidate();
}
HttpSession session = request.getSession(true);
session.setAttribute("loginUser", username);
response.sendRedirect(
request.getContextPath() + "/patient/list"
);
} else {
request.setAttribute(
"error", "帳號或密碼錯誤,請重新輸入。"
);
request.getRequestDispatcher(
"/login.jsp"
).forward(request, response);
}
}
}

測試時可以使用帳號 demo、密碼 demo123。正式部署前,必須改成從資料庫驗證帳號,並使用適當的密碼雜湊機制儲存密碼。

四、限制未登入者存取功能

只有登入頁面還不夠,還需要確認使用者在進入病患清單、詳細資料與修改頁面前,已經完成登入。

可以先在需要保護的 Servlet 中加入檢查:

HttpSession session = request.getSession(false);
if (session == null
|| session.getAttribute("loginUser") == null) {
response.sendRedirect(
request.getContextPath() + "/login.jsp"
);
return;
}

這段程式必須放在處理病患資料之前。

當功能越來越多時,將檢查集中在 Servlet Filter 會更容易維護;後續也應將不同角色的權限分開處理,不能只確認「有登入」就允許所有操作。

五、加入登出功能

建立一個簡單的 LogoutServlet:

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws IOException {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
response.sendRedirect(
request.getContextPath() + "/login.jsp"
);
}
}

登入後,可以在頁面加入登出連結:

登出

登出時呼叫 invalidate(),讓目前的 Session 失效。

六、今日小結

今天完成了登入表單、登入驗證、Session 與登出流程,也理解為什麼必須在每個受保護的功能中檢查登入狀態。

這是醫療資訊系統的重要基礎。不過,真正的醫療系統還需要角色權限、密碼安全、操作紀錄、連線加密與其他保護機制。

下一篇,我們來改善介面,讓已經具備基本功能的系統更容易操作。

參考資料:Jakarta EE 官方 Servlet 教學。


上一篇
Day 25|整理程式碼:把資料庫操作獨立成 DAO
下一篇
Day 27|改善使用者介面:讓病患清單更清楚、更好操作
系列文
30天從零打造醫療資訊小系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言